package br.edu.universo.si.projeto2.infojob.client.apresentacao;

import java.util.ArrayList;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanEmpresaAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanEstado;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanVaga;
import br.edu.universo.si.projeto2.infojob.client.componentes.comboboxes.EstadosListBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ErrorDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.InformationDialogBox;
import br.edu.universo.si.projeto2.infojob.client.util.Util;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DecoratorPanel;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

public class ABuscaVagas extends DockPanel
{
	private DisclosurePanel buscaAvancadaPanel;
	
	private DecoratorPanel buscaPanel;

	private FlexTable buscaBasicaGrid;
	private FlexTable buscaAvancadaGrid;

	private TextBox empresaTxt;
	private TextBox cargoTxt;
	private TextBox cidadeTxt;

	private ListBox cargaHorariaSemanalCb;
	private ListBox remuneracaoCb;

	private EstadosListBox estadosCb;
	
	private Button buscarBtn;
	private Button limparBtn;

	public ABuscaVagas()
	{
		inicializaComponentes();
		setarTamanhoComponentes();

		// monta o formulario de busca basica...
		buscaBasicaGrid.setWidget(0, 0, new HTML("<b>Entre com os critérios de busca:</b>"));
		buscaBasicaGrid.getFlexCellFormatter().setColSpan(0, 0, 2);
		buscaBasicaGrid.getFlexCellFormatter().setAlignment(0, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);

		buscaBasicaGrid.setWidget(1, 0, new HTML("Empresa:"));
		buscaBasicaGrid.setWidget(1, 1, empresaTxt);

		buscaBasicaGrid.setWidget(2, 0, new HTML("Cargo:"));
		buscaBasicaGrid.setWidget(2, 1, cargoTxt);

		
		// monta o formulario de busca avancada...
		buscaAvancadaGrid.setWidget(0, 0, new HTML("C.H. Semanal: "));
		buscaAvancadaGrid.setWidget(0, 1, cargaHorariaSemanalCb);

		buscaAvancadaGrid.setWidget(1, 0, new HTML("Remuneração:"));
		buscaAvancadaGrid.setWidget(1, 1, remuneracaoCb);

		buscaAvancadaGrid.setWidget(2, 0, new HTML("Cidade:"));
		buscaAvancadaGrid.setWidget(2, 1, cidadeTxt);

		buscaAvancadaGrid.setWidget(3, 0, new HTML("Estado:"));
		buscaAvancadaGrid.setWidget(3, 1, estadosCb);

		buscaAvancadaPanel.setContent(buscaAvancadaGrid);

		buscaBasicaGrid.setWidget(3, 0, buscaAvancadaPanel);
		buscaBasicaGrid.getFlexCellFormatter().setColSpan(3, 0, 2);
		
		// ajeita os botoes na grid
		FlexTable botoesAuxGrid = new FlexTable();
		botoesAuxGrid.setWidget(0, 0, buscarBtn);
		botoesAuxGrid.setWidget(0, 1, limparBtn);

		// coloca os botoes no formulario
		buscaBasicaGrid.setWidget(4, 0, botoesAuxGrid);
		buscaBasicaGrid.getFlexCellFormatter().setColSpan(4, 0, 2);
		buscaBasicaGrid.getFlexCellFormatter().setAlignment(4, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);

		buscaPanel.add(buscaBasicaGrid);

		this.add(buscaPanel, DockPanel.CENTER);
		
		// ACAO PARA BOTAO LIMPAR
		limparBtn.addClickListener(
			new ClickListener()
			{
				public void onClick(Widget sender)
				{
					empresaTxt.setText("");
					cargoTxt.setText("");
					cidadeTxt.setText("");
				}
			}
		);

		// ACAO PARA BOTAO BUSCAR
		buscarBtn.addClickListener(
			new ClickListener()
			{
				public void onClick(Widget sender)
				{
					if (empresaTxt.getText().equals("") 
						&& cargoTxt.getText().equals("") 
						&& cargaHorariaSemanalCb.getValue(cargaHorariaSemanalCb.getSelectedIndex()).equals("")
						&& remuneracaoCb.getValue(remuneracaoCb.getSelectedIndex()).equals("")
						&& cidadeTxt.getText().equals("")
						&& estadosCb.getValue(estadosCb.getSelectedIndex()).equals(""))
					{
						InformationDialogBox infoDialogBox = new InformationDialogBox("Insira pelo menos um critério para efetuar a busca.");
						infoDialogBox.center();
						infoDialogBox.show();

						return;
					}

					AsyncCallback<ArrayList<BeanVaga>> cbResultadoBusca = new AsyncCallback<ArrayList<BeanVaga>>()
					{
						public void onSuccess(ArrayList<BeanVaga> clVagas)
						{
							ABuscaVagas.this.remove(buscaPanel);
							ABuscaVagas.this.add(new ABuscaVagasResultado(clVagas), DockPanel.CENTER);
						}

						public void onFailure(Throwable caught)
						{
							ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao buscar vagas: " + caught.getMessage());
							errorDialogBox.center();
							errorDialogBox.show();
						};
					};
					
					BeanVaga bVaga = new BeanVaga();

					BeanEmpresaAssinante bEmpresaAssinante = new BeanEmpresaAssinante();
					bEmpresaAssinante.setRazaoSocial(empresaTxt.getText());

					BeanEstado bEstado = new BeanEstado();

					if (!estadosCb.getValue(estadosCb.getSelectedIndex()).equals(""))
					{
						bEstado.setId(Integer.parseInt(estadosCb.getValue(estadosCb.getSelectedIndex())));
					}

					String cargo = cargoTxt.getText();
					String cidade = cidadeTxt.getText();

					bVaga.setBEmpresaAssinante(bEmpresaAssinante);
					bVaga.setCargo(cargo);
					bVaga.setCidade(cidade);
					bVaga.setBEstado(bEstado);

					if (!cargaHorariaSemanalCb.getValue(cargaHorariaSemanalCb.getSelectedIndex()).equals(""))
					{
						bVaga.setCargaHorariaSemanal(Integer.parseInt(cargaHorariaSemanalCb.getValue(cargaHorariaSemanalCb.getSelectedIndex())));
					}

					if (!remuneracaoCb.getValue(remuneracaoCb.getSelectedIndex()).equals(""))
					{
						bVaga.setRemuneracao(Double.parseDouble(remuneracaoCb.getValue(remuneracaoCb.getSelectedIndex())));
					}

					Util.getService().buscarVagas(bVaga, cbResultadoBusca);
				}
			}
		);
	}


	private void inicializaComponentes()
	{
		buscaAvancadaPanel = new DisclosurePanel("Busca avançada");
		buscaAvancadaPanel.setAnimationEnabled(true);

		buscaPanel = new DecoratorPanel();

		buscaBasicaGrid = new FlexTable();
		buscaAvancadaGrid = new FlexTable();

		empresaTxt = new TextBox();
		cargoTxt = new TextBox();
		cidadeTxt = new TextBox();

		cargaHorariaSemanalCb = new ListBox(false);
		remuneracaoCb = new ListBox(false);

		// coloca os valores pra carga horaria semanal
		cargaHorariaSemanalCb.addItem("", "");
		cargaHorariaSemanalCb.addItem("20 horas", "20");
		cargaHorariaSemanalCb.addItem("30 horas", "30");
		cargaHorariaSemanalCb.addItem("35 horas", "35");
		cargaHorariaSemanalCb.addItem("40 horas", "40");

		// valores pre-definidos para o campo remuneracao
		remuneracaoCb.addItem("", "");
		remuneracaoCb.addItem("R$1.000,00", "1000");
		remuneracaoCb.addItem("R$2.000,00", "2000");
		remuneracaoCb.addItem("R$3.000,00", "3000");
		remuneracaoCb.addItem("R$4.000,00", "4000");
		remuneracaoCb.addItem("R$5.000,00", "5000");
		remuneracaoCb.addItem("R$6.000,00", "6000");
		remuneracaoCb.addItem("R$7.000,00", "7000");
		remuneracaoCb.addItem("R$8.000,00", "8000");
		remuneracaoCb.addItem("R$9.000,00", "9000");
		remuneracaoCb.addItem("R$10.000,00", "10000");
		remuneracaoCb.addItem("R$11.000,00", "11000");
		remuneracaoCb.addItem("R$12.000,00", "12000");
		remuneracaoCb.addItem("R$13.000,00", "13000");
		remuneracaoCb.addItem("R$14.000,00", "14000");
		remuneracaoCb.addItem("R$15.000,00", "15000");
		remuneracaoCb.addItem("R$16.000,00", "16000");
		remuneracaoCb.addItem("R$17.000,00", "17000");
		remuneracaoCb.addItem("R$18.000,00", "18000");
		remuneracaoCb.addItem("R$19.000,00", "19000");
		remuneracaoCb.addItem("R$20.000,00", "20000");

		estadosCb = new EstadosListBox();

		buscarBtn = new Button("Buscar");
		limparBtn = new Button("Limpar");
	}


	private void setarTamanhoComponentes()
	{
		buscaBasicaGrid.setCellSpacing(5);
		buscaAvancadaGrid.setCellSpacing(5);

		empresaTxt.setWidth("280px");
		cargoTxt.setWidth("280px");
		cidadeTxt.setWidth("115px");
		
		cargaHorariaSemanalCb.setWidth("150px");
		remuneracaoCb.setWidth("150px");

		empresaTxt.setMaxLength(50);
		cargoTxt.setMaxLength(50);
		cidadeTxt.setMaxLength(40);
	}
}